package br.com.srv.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

import br.com.srv.exception.FFServiceException;
import br.com.srv.service.ClasseServico;

public class DadosLidoDAOImpl extends SimpleJdbcDaoSupport implements DadosLidoDAO {

	public String buscarVeiculoIdBySerial(String serial)
			throws FFServiceException {
		String result = "";

		String sql = "SELECT VEI_ID FROM veiculo WHERE EQP_SRN = ?";
		
		String parametros[] = {serial};
		
		result = (String)getJdbcTemplate().query(sql, parametros,
				new ResultSetExtractor() {  
					public Object extractData(ResultSet rs) {
						
						String resultado = ""; 
						try {
							while (rs.next()) {  
								resultado = rs.getString("VEI_ID");
	
							}
						} catch (SQLException e) {
							e.printStackTrace();
						}
						return resultado;  
					}
				});

		return result;
	}

	public Map<String, String> primeiraVezUltimoDadoLido(String veiculoId)
			throws FFServiceException {

		Map<String, String> result = null;

		String sql = "SELECT UDL_LNG, UDL_LAT FROM ult_dado_lido WHERE VEI_ID = ?";
		
		String parametros[] = {veiculoId};
		
		List<Map<String, String>> lista = getJdbcTemplate().query(sql, parametros, new LongLatMapper());
		
		if (!lista.isEmpty()) {
			result = (Map<String, String>)lista.get(0);
		}

		return result;
	}
	


	public void inserirUltimoDadoLido(String veiculoId, String dataModulo,
			String longitude, String latitude, String velocidade, String ignicao,
			String idPontoMaisProximo, String distanciaPontoMaisProximo,
			String dinstanciaUltimoPonto, Map<String, String> paramAdicionais)
			throws FFServiceException {

		String sql = "INSERT INTO ult_dado_lido ("
				+ "VEI_ID, UDL_DH, UDL_LAT, UDL_LNG, UDL_VEL, UDL_BYT1,"
				+ " PTP_ID, UDL_PDIS, UDL_ODM, UDL_MOT_ID, UDL_MOD) "
				+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
		
		String codMotorista = paramAdicionais.get(ClasseServico.CONST_MOTORISTA);
		String countGuincho = paramAdicionais.get(ClasseServico.CONST_GUINCHO);
		
		codMotorista = (codMotorista == null ? "0" : codMotorista);
		countGuincho = (countGuincho == null ? "0" : countGuincho);
		
		distanciaPontoMaisProximo = (distanciaPontoMaisProximo == null ? "0" : distanciaPontoMaisProximo);
		
		String parametros[] = {veiculoId, dataModulo, latitude, longitude, velocidade, ignicao,
				idPontoMaisProximo, distanciaPontoMaisProximo, dinstanciaUltimoPonto, codMotorista, countGuincho};
		
		getJdbcTemplate().update(sql, parametros);

	}

	public void atualizarUltimoDadoLido(String veiculoId, String dataModulo,
			String longitude, String latitude, String velocidade, String ignicao,
			String idPontoMaisProximo, String distanciaPontoMaisProximo, String dinstanciaUltimoPonto,
			Map<String, String> paramAdicionais)
			throws FFServiceException {

			String sql = "UPDATE ult_dado_lido "
					+ "SET UDL_DH = ?, UDL_LAT = ? , UDL_LNG = ?, UDL_VEL = ?, UDL_BYT1 = ?, PTP_ID = ?, "
					+ "UDL_PDIS = ?, UDL_ODM = ?,  UDL_MOT_ID = ? , UDL_MOD = ? "
					+ "WHERE VEI_ID = ?";
			
			String codMotorista = paramAdicionais.get(ClasseServico.CONST_MOTORISTA);
			String countGuincho = paramAdicionais.get(ClasseServico.CONST_GUINCHO);
			
			codMotorista = (codMotorista == null ? "0" : codMotorista);
			countGuincho = (countGuincho == null ? "0" : countGuincho);
			
			distanciaPontoMaisProximo = (distanciaPontoMaisProximo == null ? "0" : distanciaPontoMaisProximo);
			
			Object parametros[] = {dataModulo, latitude, longitude, velocidade, ignicao,
					idPontoMaisProximo, distanciaPontoMaisProximo, dinstanciaUltimoPonto,
					codMotorista, countGuincho, veiculoId};
			
			try {
				getJdbcTemplate().update(sql, parametros);
			} catch (Exception e) {
				String a = "";
				for (int i = 0; i < parametros.length; i++) {
					a += parametros[i].toString() + ", ";
				}
				throw new FFServiceException(e, "Erro no atualizarUltimoDadoLido(), Violação de dados: " + sql + " - ");

			}

	}

	public void inserirDadoLido(String veiculoId, String dataModulo,
			String longitude, String latitude, String velocidade, String ignicao,
			String idPontoMaisProximo, String distanciaPontoMaisProximo, String distanciaUltimoPonto)
			throws FFServiceException {

		String sql = "INSERT INTO dado_lido (VEI_ID, DDL_DH, DDL_LAT, DDL_LNG, DDL_VEL, DDL_BYT1, PTP_ID, DDL_PDIS, DDL_ODM) "
				+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
		
		String parametros[] = {veiculoId, dataModulo, latitude, longitude, velocidade, ignicao,
				idPontoMaisProximo, distanciaPontoMaisProximo, distanciaUltimoPonto};
		
		getJdbcTemplate().update(sql, parametros);

	}

	public List<Map<String, String>> buscarComandosNaoEnviadosPorVeiculoId(String serial) throws FFServiceException {
		
		List<Map<String, String>> result = new ArrayList<Map<String, String>>();
	
			String sql = "SELECT ID, CMD_DESC FROM comando WHERE SRN_VEI = ? AND ST_CMD = 0";
			
			String parametros[] = {serial};
			
			result = getJdbcTemplate().query(sql, parametros, new ComandosNaoEnviadosMapper());
	
		return result;
	}

	public void setarComandoComoEnviado(String comandoId) throws FFServiceException {

			String sql = "UPDATE comando "
					+ "SET ST_CMD = 1 WHERE ID = ?";
			
			String parametros[] = {comandoId};
			
			getJdbcTemplate().update(sql, parametros);		
	}
	
    private static class LongLatMapper implements RowMapper {

		public Map<String, String> mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Map<String, String> ponto = new HashMap<String, String>();
			ponto.put("LNG", resultSet.getString(1));
			ponto.put("LAT", resultSet.getString(2));
			return ponto;
		}

    }
    
    private static class ComandosNaoEnviadosMapper implements RowMapper {

		public Map<String, String> mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Map<String, String> ponto = new HashMap<String, String>();
			ponto.put("ID", resultSet.getString("ID"));
			ponto.put("CMD_DESC", resultSet.getString("CMD_DESC"));
			return ponto;
			
		}

    }

}
